#include <QDebug>
#include <QVector>
#include <QTextStream>
#include <QFile>
#include <String>
#include<iostream>
#include <QList>
namespace SK {
enum SortKind{
    col01    =   0x00000001<<0,         //!< 第1列
    col02    =   0x00000001<<1,         //!< 第2列
    col03    =   0x00000001<<2,         //!< 第3列
    col04    =   0x00000001<<3,         //!< 第4列
    col05    =   0x00000001<<4,         //!< 第5列
    col06    =   0x00000001<<5,         //!< 第6列
    col07    =   0x00000001<<6,         //!< 第7列
    col08    =   0x00000001<<7,         //!< 第8列
    col09    =   0x00000001<<8,         //!< 第9列
    col10    =   0x00000001<<9,         //!< 第10列
    col11    =   0x00000001<<10,        //!< 第11列
    col12    =   0x00000001<<11,        //!< 第12列
    col13    =   0x00000001<<12,        //!< 第13列
    col14    =   0x00000001<<13,        //!< 第14列
    col15    =   0x00000001<<14,        //!< 第15列
    col16    =   0x00000001<<15,        //!< 第16列
    col17    =   0x00000001<<16,        //!< 第17列
    col18    =   0x00000001<<17,        //!< 第18列
    col19    =   0x00000001<<18,        //!< 第19列
    col20    =   0x00000001<<19,        //!< 第20列
    col21    =   0x00000001<<20,        //!< 第21列
    col22    =   0x00000001<<21,        //!< 第22列
    col23    =   0x00000001<<22,        //!< 第23列
    col24    =   0x00000001<<23,        //!< 第24列
    col25    =   0x00000001<<24,        //!< 第25列
    col26    =   0x00000001<<25,        //!< 第26列
    col27    =   0x00000001<<26,        //!< 第27列
    col28    =   0x00000001<<27,        //!< 第28列
    col29    =   0x00000001<<28,        //!< 第29列
    col30    =   0x00000001<<29,        //!< 第30列
    col31    =   0x00000001<<30,        //!< 第31列
    col32    =   0x00000001<<31,        //!< 第32列
};
}


typedef struct
{
    QStringList list_date; // 请补全结构定义
}
studData;

QDebug operator<< (QDebug d, const studData &data)
{
    for(int i=0;i<data.list_date.size();i++)
      {
          d.noquote()<<data.list_date.at(i);
      }
      qDebug()<<"";
      return d;
  }


// 比较类，用于std::sort第三个参数
class myCmp {
public:
    myCmp(int selectedColumn) { this->currentColumn = selectedColumn; }
    bool operator() (const studData& d1,const studData& d2);
private:
    int currentColumn;
};

bool myCmp::operator()(const studData &d1, const studData &d2)
{
    bool result = false;
    quint32 sortedColumn = 0x00000001<<currentColumn;
    switch (sortedColumn) {
        case SK::col01: result=d1.list_date.at(1)>d2.list_date.at(1);   break;
        case SK::col02: result=d1.list_date.at(2)>d2.list_date.at(2);   break;
        case SK::col03: result=d1.list_date.at(3)>d2.list_date.at(3);   break;
        case SK::col04: result=d1.list_date.at(4)>d2.list_date.at(4);   break;
        case SK::col05: result=d1.list_date.at(5)>d2.list_date.at(5);   break;
        case SK::col06: result=d1.list_date.at(6)>d2.list_date.at(6);   break;
        case SK::col07: result=d1.list_date.at(7)>d2.list_date.at(7);   break;
        case SK::col08: result=d1.list_date.at(8)>d2.list_date.at(8);   break;
        case SK::col09: result=d1.list_date.at(9)>d2.list_date.at(9 );  break;
        case SK::col10: result=d1.list_date.at(10)>d2.list_date.at(10); break;
        case SK::col11: result=d1.list_date.at(11)>d2.list_date.at(11); break;
        case SK::col12: result=d1.list_date.at(12)>d2.list_date.at(12); break;
        case SK::col13: result=d1.list_date.at(13)>d2.list_date.at(13); break;
        case SK::col14: result=d1.list_date.at(14)>d2.list_date.at(14); break;
        case SK::col15: result=d1.list_date.at(15)>d2.list_date.at(15); break;
        case SK::col16: result=d1.list_date.at(16)>d2.list_date.at(16); break;
        case SK::col17: result=d1.list_date.at(17)>d2.list_date.at(17); break;
        case SK::col18: result=d1.list_date.at(18)>d2.list_date.at(18); break;
        case SK::col19: result=d1.list_date.at(19)>d2.list_date.at(19); break;
        case SK::col20: result=d1.list_date.at(20)>d2.list_date.at(20); break;
        case SK::col21: result=d1.list_date.at(21)>d2.list_date.at(21); break;
        case SK::col22: result=d1.list_date.at(22)>d2.list_date.at(22); break;
        case SK::col23: result=d1.list_date.at(23)>d2.list_date.at(23 );break;
        case SK::col24: result=d1.list_date.at(24)>d2.list_date.at(24 );break;
        case SK::col25: result=d1.list_date.at(25)>d2.list_date.at(25 );break;
        case SK::col26: result=d1.list_date.at(26)>d2.list_date.at(26 );break;
        case SK::col27: result=d1.list_date.at(27)>d2.list_date.at(27 );break;
        case SK::col28: result=d1.list_date.at(28)>d2.list_date.at(28 );break;
        case SK::col29: result=d1.list_date.at(29)>d2.list_date.at(29 );break;
        case SK::col30: result=d1.list_date.at(30)>d2.list_date.at(30 );break;
        case SK::col31: result=d1.list_date.at(31)>d2.list_date.at(31 );break;
        case SK::col32: result=d1.list_date.at(32)>d2.list_date.at(32 );break;

    }
    return result;

}



class ScoreSorter
{
public:
    ScoreSorter(QString dataFile);
    void readFile();
    void doSort();
private:
    QString fname;
    QList <studData> date;
    QStringList  htitle;
}

ScoreSorter::ScoreSorter(QString dataFile){
    fname=dateFile;
}

void ScoreSorter::readFile()
{
    QFile file(fname);
        if (!file.open(QFile::ReadOnly|QIODevice::Text)){
          qDebug()<<QString("文件 %1 打开失败").arg(fname);
             return ;
 }


     //QTextStream in(&file);
     in.setCodec("utf-8");
     qDebug().noquote().nospace()<<"开始读取文件："<<fname;
      studData everydate;
 QString line1(in.readLine());
     htitle = line1.split(" ", QString::SkipEmptyParts);


 while (!in.atEnd())
  {
  QString line =in.readLine();
  everydate.list_date=line.split("  ", QString::SkipEmptyParts);
  if((everydate.list_date).last() == "\n")everydate.list_date.removeLast();
         if(everydate.list_date.size()==0) continue;
 date.append(everydate);
 QString str(line);
            qDebug()<<str;

  file.close();
  qDebug().noquote().nospace()<<"文件读取完成："<<fname;


  void ScoreSorter::doSort()
  {


  {
      QFile file("sorted_"+fname);
  //    file.open(QIODevice::ReadWrite | QIODevice::Text);
      if (!file.open(QFile::WriteOnly|QIODevice::Text)){
        qDebug()<<QString("文件 %1 打开失败").arg(fname);
           return ;
      }
      qDebug().noquote().nospace()<<"开始写入文件："<<fname;
      QTextStream out(&file);
      out.setCodec("utf-8");  //采用“utf-8”编码
      for(int i=1;i<htitle.size();i++)
         {
             sort_Column now_Column(i-1);
             std::sort(date.begin() , date.end() , now_Column );

             qDebug()<<"排序后输出，当前排序第 "<<i <<" 列：";
             qDebug()<< htitle;
             for(int i=0;i<date.size();i++)
             qDebug() <<date.at(i);
             qDebug()<<"-------------------------------------------------------\n";


             for(int j=0;j<htitle.size();j++)
                   out<<htitle.at(j)<<"\t";
               out<<"\r\n";
               for(int i=0;i<date.size();i++)
               {
                   for(int j=0;j<htitle.size()-1;j++)
                       out<<date.at(i).list_date.at(j)<<"\t";
                   out<<"\r\n";
               }
               out<<"-------------------------------------------------------------"<<"\r\n";
               }

}
          file.close();
         qDebug().noquote().nospace()<<"文件写入完成："<<fname;

}


void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray txtMsg = msg.toLocal8Bit();
       switch (type)
       {
       case QtDebugMsg:
           fprintf(stderr, "Debug: %s (%s:%u, %s)\n", txtMsg.constData(), context.file, context.line, context.function);
           break;
       case QtInfoMsg:
           fprintf(stderr, "Info: %s (%s:%u, %s)\n", txtMsg.constData(), context.file, context.line, context.function);
           break;
       case QtWarningMsg:
           fprintf(stderr, "Warning: %s (%s:%u, %s)\n", txtMsg.constData(), context.file, context.line, context.function);
           break;
       case QtCriticalMsg:
           fprintf(stderr, "Critical: %s (%s:%u, %s)\n", txtMsg.constData(), context.file, context.line, context.function);
           break;
       case QtFatalMsg:
           fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", txtMsg.constData(), context.file, context.line, context.function);
           abort();
       }
}

int main()
{
    //qInstallMessageHandler(myMessageOutput);
   QString datafile = "data.txt";

    // 如果排序后文件已存在，则删除之
    QFile f("sorted_"+datafile);
    if (f.exists())
    {
        f.remove();
    }

    ScoreSorter s(datafile);
    s.readFile();// 读取数据文件
    s.doSort();//排序并导出
    return 0;
}
